import cv2
import os

# 配置参数
input_folder = "D:/Desk/test1/content/"  # 原始图片目录
output_folder = "D:/Desk/test1/result/"  # 输出目录

# 确保输出目录存在
os.makedirs(output_folder, exist_ok=True)

# 创建 HOG 行人检测器（检测全身区域）
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

# 遍历所有图片
for filename in os.listdir(input_folder):
    if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
        img_path = os.path.join(input_folder, filename)
        img = cv2.imread(img_path)
        if img is None:
            continue

        h, w = img.shape[:2]  # 获取原始高度和宽度

        # --- 核心逻辑：计算目标宽度（3:4比例）---
        target_width = int(3/4 * h)  # 固定高度，宽度按比例计算
        if target_width > w:
            print(f"警告：图片 {filename} 宽度不足，无法裁剪到 {target_width} 像素（需≥{target_width}），已跳过")
            continue

        # --- 步骤 1：检测人体中心点 ---
        (regions, _) = hog.detectMultiScale(img, winStride=(4, 4), padding=(8, 8), scale=1.05)
        x_center = w // 2  # 默认水平居中
        
        if len(regions) > 0:
            # 选择面积最大的人体框
            max_area = 0
            best_box = None
            for (x, y, w_box, h_box) in regions:
                if w_box * h_box > max_area:
                    max_area = w_box * h_box
                    best_box = (x, y, w_box, h_box)
            
            # 计算人体水平中心点（躯干位置）
            x_center = best_box[0] + best_box[2] // 2

        # --- 步骤 2：计算裁剪区域 ---
        x_start = x_center - target_width // 2
        x_end = x_start + target_width

        # 处理左/右边界溢出
        if x_start < 0:
            x_start = 0
            x_end = target_width
        elif x_end > w:
            x_end = w
            x_start = w - target_width

        # --- 步骤 3：执行裁剪 ---
        cropped = img[0:h, x_start:x_end]  # 保持原图高度，水平裁剪

        # 保存结果
        output_path = os.path.join(output_folder, filename)
        cv2.imwrite(output_path, cropped)

print("批量裁剪完成！")